Run download_data.Rmd and percentage_of_regional_richness.Rmd First!

library(randomForest)
randomForest 4.6-14
Type rfNews() to see new features/changes/bug fixes.
library(reshape2)
library(rpart)
library(ggplot2)

Attaching package: ‘ggplot2’

The following object is masked from ‘package:randomForest’:

    margin
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✔ tibble  3.1.8     ✔ dplyr   1.0.7
✔ tidyr   1.1.3     ✔ stringr 1.4.0
✔ readr   1.4.0     ✔ forcats 0.5.1
✔ purrr   0.3.4     
Warning: package ‘tibble’ was built under R version 4.1.2── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::combine()  masks randomForest::combine()
✖ dplyr::filter()   masks stats::filter()
✖ dplyr::lag()      masks stats::lag()
✖ ggplot2::margin() masks randomForest::margin()
library(multcomp)
Loading required package: mvtnorm
Loading required package: survival
city_data
length(city_data$city_gdp_per_population[!is.na(city_data$city_gdp_per_population)])
[1] 30
length(city_data$percentage_urban_area_as_open_public_spaces[!is.na(city_data$percentage_urban_area_as_open_public_spaces)])
[1] 61
length(city_data$happiness_future_life[!is.na(city_data$happiness_future_life)])
[1] 65
length(city_data$mean_population_exposure_to_pm2_5_2019[!is.na(city_data$mean_population_exposure_to_pm2_5_2019)])
[1] 131
fetch_city_data_for <- function(pool_name, include_city_name = F) {
  results_filename <- paste(paste('percentage_of_regional_richness__output_', pool_name, 'city', 'richness', 'intercept', sep = "_"), "csv", sep = ".")
  results <- read_csv(results_filename)
  
  joined <- left_join(city_data, results)
  joined$abs_city_centre_latitude = abs(joined$city_centre_latitude)
  
  required_columns <- c("population_growth", "rainfall_monthly_min", "rainfall_annual_average", "rainfall_monthly_max", "temperature_annual_average", "temperature_monthly_min", "temperature_monthly_max", "happiness_negative_effect", "happiness_positive_effect", "happiness_future_life", "number_of_biomes", "realm", "biome_name", "region_20km_includes_estuary", "region_50km_includes_estuary", "region_100km_includes_estuary", "city_includes_estuary", "region_20km_average_pop_density", "region_50km_average_pop_density", "region_100km_average_pop_density", "city_max_pop_density", "city_average_pop_density", "mean_population_exposure_to_pm2_5_2019", "region_20km_cultivated", "region_20km_urban", "region_50km_cultivated", "region_50km_urban", "region_100km_cultivated", "region_100km_urban", "region_20km_elevation_delta", "region_20km_mean_elevation", "region_50km_elevation_delta", "region_50km_mean_elevation", "region_100km_elevation_delta", "region_100km_mean_elevation", "city_elevation_delta", "city_mean_elevation", "urban", "shrubs", "permanent_water", "open_forest", "herbaceous_wetland", "herbaceous_vegetation", "cultivated", "closed_forest", "share_of_population_within_400m_of_open_space", "percentage_urban_area_as_streets", "percentage_urban_area_as_open_public_spaces_and_streets", "percentage_urban_area_as_open_public_spaces", "city_gdp_per_population", "city_ndvi", "city_ssm", "city_susm", "region_20km_ndvi", "region_20km_ssm", "region_20km_susm", "region_50km_ndvi", "region_50km_ssm", "region_50km_susm", "region_100km_ndvi", "region_100km_ssm", "region_100km_susm", "city_percentage_protected", "region_20km_percentage_protected", "region_50km_percentage_protected", "region_100km_percentage_protected", "city_centre_latitude", "abs_city_centre_latitude")
  
  if (include_city_name) {
    required_columns <- append(c("name"), required_columns)
  }
  
  required_columns <- append(c("response"), required_columns)
  
  joined[,required_columns]
}
Merlin Response
merlin_city_data <- fetch_city_data_for('merlin')

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)
Joining, by = "name"
merlin_city_data
merlin_city_data_fixed <- rfImpute(response ~ ., merlin_city_data)
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.68   120.25 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.57   119.65 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.74   120.63 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    20.74   115.04 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.27   117.97 |
merlin_city_data_fixed
ggplot(merlin_city_data_fixed, aes(response)) + geom_histogram(binwidth = 2)

names(merlin_city_data_fixed)
 [1] "response"                                                "population_growth"                                       "rainfall_monthly_min"                                   
 [4] "rainfall_annual_average"                                 "rainfall_monthly_max"                                    "temperature_annual_average"                             
 [7] "temperature_monthly_min"                                 "temperature_monthly_max"                                 "happiness_negative_effect"                              
[10] "happiness_positive_effect"                               "happiness_future_life"                                   "number_of_biomes"                                       
[13] "realm"                                                   "biome_name"                                              "region_20km_includes_estuary"                           
[16] "region_50km_includes_estuary"                            "region_100km_includes_estuary"                           "city_includes_estuary"                                  
[19] "region_20km_average_pop_density"                         "region_50km_average_pop_density"                         "region_100km_average_pop_density"                       
[22] "city_max_pop_density"                                    "city_average_pop_density"                                "mean_population_exposure_to_pm2_5_2019"                 
[25] "region_20km_cultivated"                                  "region_20km_urban"                                       "region_50km_cultivated"                                 
[28] "region_50km_urban"                                       "region_100km_cultivated"                                 "region_100km_urban"                                     
[31] "region_20km_elevation_delta"                             "region_20km_mean_elevation"                              "region_50km_elevation_delta"                            
[34] "region_50km_mean_elevation"                              "region_100km_elevation_delta"                            "region_100km_mean_elevation"                            
[37] "city_elevation_delta"                                    "city_mean_elevation"                                     "urban"                                                  
[40] "shrubs"                                                  "permanent_water"                                         "open_forest"                                            
[43] "herbaceous_wetland"                                      "herbaceous_vegetation"                                   "cultivated"                                             
[46] "closed_forest"                                           "share_of_population_within_400m_of_open_space"           "percentage_urban_area_as_streets"                       
[49] "percentage_urban_area_as_open_public_spaces_and_streets" "percentage_urban_area_as_open_public_spaces"             "city_gdp_per_population"                                
[52] "city_ndvi"                                               "city_ssm"                                                "city_susm"                                              
[55] "region_20km_ndvi"                                        "region_20km_ssm"                                         "region_20km_susm"                                       
[58] "region_50km_ndvi"                                        "region_50km_ssm"                                         "region_50km_susm"                                       
[61] "region_100km_ndvi"                                       "region_100km_ssm"                                        "region_100km_susm"                                      
[64] "city_percentage_protected"                               "region_20km_percentage_protected"                        "region_50km_percentage_protected"                       
[67] "region_100km_percentage_protected"                       "city_centre_latitude"                                    "abs_city_centre_latitude"                               
merlin_response <- merlin_city_data_fixed$response
merlin_predictors <- merlin_city_data_fixed[,-1]
merlin_predictors
merlin_interp <- VSURF(x = merlin_predictors, y  = merlin_response)
Thresholding step
Estimated computational time (on one core): 117.9 sec.

  |                                                                                                                                                                                         
  |                                                                                                                                                                                   |   0%
  |                                                                                                                                                                                         
  |====                                                                                                                                                                               |   2%
  |                                                                                                                                                                                         
  |=======                                                                                                                                                                            |   4%
  |                                                                                                                                                                                         
  |===========                                                                                                                                                                        |   6%
  |                                                                                                                                                                                         
  |==============                                                                                                                                                                     |   8%
  |                                                                                                                                                                                         
  |==================                                                                                                                                                                 |  10%
  |                                                                                                                                                                                         
  |=====================                                                                                                                                                              |  12%
  |                                                                                                                                                                                         
  |=========================                                                                                                                                                          |  14%
  |                                                                                                                                                                                         
  |=============================                                                                                                                                                      |  16%
  |                                                                                                                                                                                         
  |================================                                                                                                                                                   |  18%
  |                                                                                                                                                                                         
  |====================================                                                                                                                                               |  20%
  |                                                                                                                                                                                         
  |=======================================                                                                                                                                            |  22%
  |                                                                                                                                                                                         
  |===========================================                                                                                                                                        |  24%
  |                                                                                                                                                                                         
  |===============================================                                                                                                                                    |  26%
  |                                                                                                                                                                                         
  |==================================================                                                                                                                                 |  28%
  |                                                                                                                                                                                         
  |======================================================                                                                                                                             |  30%
  |                                                                                                                                                                                         
  |=========================================================                                                                                                                          |  32%
  |                                                                                                                                                                                         
  |=============================================================                                                                                                                      |  34%
  |                                                                                                                                                                                         
  |================================================================                                                                                                                   |  36%
  |                                                                                                                                                                                         
  |====================================================================                                                                                                               |  38%
  |                                                                                                                                                                                         
  |========================================================================                                                                                                           |  40%
  |                                                                                                                                                                                         
  |===========================================================================                                                                                                        |  42%
  |                                                                                                                                                                                         
  |===============================================================================                                                                                                    |  44%
  |                                                                                                                                                                                         
  |==================================================================================                                                                                                 |  46%
  |                                                                                                                                                                                         
  |======================================================================================                                                                                             |  48%
  |                                                                                                                                                                                         
  |==========================================================================================                                                                                         |  50%
  |                                                                                                                                                                                         
  |=============================================================================================                                                                                      |  52%
  |                                                                                                                                                                                         
  |=================================================================================================                                                                                  |  54%
  |                                                                                                                                                                                         
  |====================================================================================================                                                                               |  56%
  |                                                                                                                                                                                         
  |========================================================================================================                                                                           |  58%
  |                                                                                                                                                                                         
  |===========================================================================================================                                                                        |  60%
  |                                                                                                                                                                                         
  |===============================================================================================================                                                                    |  62%
  |                                                                                                                                                                                         
  |===================================================================================================================                                                                |  64%
  |                                                                                                                                                                                         
  |======================================================================================================================                                                             |  66%
  |                                                                                                                                                                                         
  |==========================================================================================================================                                                         |  68%
  |                                                                                                                                                                                         
  |=============================================================================================================================                                                      |  70%
  |                                                                                                                                                                                         
  |=================================================================================================================================                                                  |  72%
  |                                                                                                                                                                                         
  |====================================================================================================================================                                               |  74%
  |                                                                                                                                                                                         
  |========================================================================================================================================                                           |  76%
  |                                                                                                                                                                                         
  |============================================================================================================================================                                       |  78%
  |                                                                                                                                                                                         
  |===============================================================================================================================================                                    |  80%
  |                                                                                                                                                                                         
  |===================================================================================================================================================                                |  82%
  |                                                                                                                                                                                         
  |======================================================================================================================================================                             |  84%
  |                                                                                                                                                                                         
  |==========================================================================================================================================================                         |  86%
  |                                                                                                                                                                                         
  |==============================================================================================================================================================                     |  88%
  |                                                                                                                                                                                         
  |=================================================================================================================================================================                  |  90%
  |                                                                                                                                                                                         
  |=====================================================================================================================================================================              |  92%
  |                                                                                                                                                                                         
  |========================================================================================================================================================================           |  94%
  |                                                                                                                                                                                         
  |============================================================================================================================================================================       |  96%
  |                                                                                                                                                                                         
  |===============================================================================================================================================================================    |  98%
  |                                                                                                                                                                                         
  |===================================================================================================================================================================================| 100%
Interpretation step (on 44 variables)
Estimated computational time (on one core): between 56.1 sec. and  370.7 sec.

  |                                                                                                                                                                                         
  |                                                                                                                                                                                   |   0%
  |                                                                                                                                                                                         
  |====                                                                                                                                                                               |   2%
  |                                                                                                                                                                                         
  |========                                                                                                                                                                           |   5%
  |                                                                                                                                                                                         
  |============                                                                                                                                                                       |   7%
  |                                                                                                                                                                                         
  |================                                                                                                                                                                   |   9%
  |                                                                                                                                                                                         
  |====================                                                                                                                                                               |  11%
  |                                                                                                                                                                                         
  |========================                                                                                                                                                           |  14%
  |                                                                                                                                                                                         
  |============================                                                                                                                                                       |  16%
  |                                                                                                                                                                                         
  |=================================                                                                                                                                                  |  18%
  |                                                                                                                                                                                         
  |=====================================                                                                                                                                              |  20%
  |                                                                                                                                                                                         
  |=========================================                                                                                                                                          |  23%
  |                                                                                                                                                                                         
  |=============================================                                                                                                                                      |  25%
  |                                                                                                                                                                                         
  |=================================================                                                                                                                                  |  27%
  |                                                                                                                                                                                         
  |=====================================================                                                                                                                              |  30%
  |                                                                                                                                                                                         
  |=========================================================                                                                                                                          |  32%
  |                                                                                                                                                                                         
  |=============================================================                                                                                                                      |  34%
  |                                                                                                                                                                                         
  |=================================================================                                                                                                                  |  36%
  |                                                                                                                                                                                         
  |=====================================================================                                                                                                              |  39%
  |                                                                                                                                                                                         
  |=========================================================================                                                                                                          |  41%
  |                                                                                                                                                                                         
  |=============================================================================                                                                                                      |  43%
  |                                                                                                                                                                                         
  |=================================================================================                                                                                                  |  45%
  |                                                                                                                                                                                         
  |=====================================================================================                                                                                              |  48%
  |                                                                                                                                                                                         
  |==========================================================================================                                                                                         |  50%
  |                                                                                                                                                                                         
  |==============================================================================================                                                                                     |  52%
  |                                                                                                                                                                                         
  |==================================================================================================                                                                                 |  55%
  |                                                                                                                                                                                         
  |======================================================================================================                                                                             |  57%
  |                                                                                                                                                                                         
  |==========================================================================================================                                                                         |  59%
  |                                                                                                                                                                                         
  |==============================================================================================================                                                                     |  61%
  |                                                                                                                                                                                         
  |==================================================================================================================                                                                 |  64%
  |                                                                                                                                                                                         
  |======================================================================================================================                                                             |  66%
  |                                                                                                                                                                                         
  |==========================================================================================================================                                                         |  68%
  |                                                                                                                                                                                         
  |==============================================================================================================================                                                     |  70%
  |                                                                                                                                                                                         
  |==================================================================================================================================                                                 |  73%
  |                                                                                                                                                                                         
  |======================================================================================================================================                                             |  75%
  |                                                                                                                                                                                         
  |==========================================================================================================================================                                         |  77%
  |                                                                                                                                                                                         
  |==============================================================================================================================================                                     |  80%
  |                                                                                                                                                                                         
  |==================================================================================================================================================                                 |  82%
  |                                                                                                                                                                                         
  |=======================================================================================================================================================                            |  84%
  |                                                                                                                                                                                         
  |===========================================================================================================================================================                        |  86%
  |                                                                                                                                                                                         
  |===============================================================================================================================================================                    |  89%
  |                                                                                                                                                                                         
  |===================================================================================================================================================================                |  91%
  |                                                                                                                                                                                         
  |=======================================================================================================================================================================            |  93%
  |                                                                                                                                                                                         
  |===========================================================================================================================================================================        |  95%
  |                                                                                                                                                                                         
  |===============================================================================================================================================================================    |  98%
  |                                                                                                                                                                                         
  |===================================================================================================================================================================================| 100%
Prediction step (on 3 variables)
Maximum estimated computational time (on one core): 3.9 sec.

  |                                                                                                                                                                                         
  |                                                                                                                                                                                   |   0%
  |                                                                                                                                                                                         
  |============================================================                                                                                                                       |  33%
  |                                                                                                                                                                                         
  |=======================================================================================================================                                                            |  67%
  |                                                                                                                                                                                         
  |===================================================================================================================================================================================| 100%
names(merlin_predictors[,merlin_interp$varselect.interp])
[1] "abs_city_centre_latitude"    "region_50km_elevation_delta" "biome_name"                 
Birdlife Response
birdlife_city_data <- fetch_city_data_for('birdlife')

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)
Joining, by = "name"
birdlife_city_data
ggplot(birdlife_city_data, aes(response)) + geom_histogram(binwidth = 1)

birdlife_city_data_fixed <- rfImpute(response ~ ., birdlife_city_data)
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.673    89.80 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.688    90.04 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.723    90.60 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.884    93.14 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.674    89.83 |
birdlife_city_data_fixed
names(birdlife_city_data_fixed)
 [1] "response"                                                "population_growth"                                       "rainfall_monthly_min"                                   
 [4] "rainfall_annual_average"                                 "rainfall_monthly_max"                                    "temperature_annual_average"                             
 [7] "temperature_monthly_min"                                 "temperature_monthly_max"                                 "happiness_negative_effect"                              
[10] "happiness_positive_effect"                               "happiness_future_life"                                   "number_of_biomes"                                       
[13] "realm"                                                   "biome_name"                                              "region_20km_includes_estuary"                           
[16] "region_50km_includes_estuary"                            "region_100km_includes_estuary"                           "city_includes_estuary"                                  
[19] "region_20km_average_pop_density"                         "region_50km_average_pop_density"                         "region_100km_average_pop_density"                       
[22] "city_max_pop_density"                                    "city_average_pop_density"                                "mean_population_exposure_to_pm2_5_2019"                 
[25] "region_20km_cultivated"                                  "region_20km_urban"                                       "region_50km_cultivated"                                 
[28] "region_50km_urban"                                       "region_100km_cultivated"                                 "region_100km_urban"                                     
[31] "region_20km_elevation_delta"                             "region_20km_mean_elevation"                              "region_50km_elevation_delta"                            
[34] "region_50km_mean_elevation"                              "region_100km_elevation_delta"                            "region_100km_mean_elevation"                            
[37] "city_elevation_delta"                                    "city_mean_elevation"                                     "urban"                                                  
[40] "shrubs"                                                  "permanent_water"                                         "open_forest"                                            
[43] "herbaceous_wetland"                                      "herbaceous_vegetation"                                   "cultivated"                                             
[46] "closed_forest"                                           "share_of_population_within_400m_of_open_space"           "percentage_urban_area_as_streets"                       
[49] "percentage_urban_area_as_open_public_spaces_and_streets" "percentage_urban_area_as_open_public_spaces"             "city_gdp_per_population"                                
[52] "city_ndvi"                                               "city_ssm"                                                "city_susm"                                              
[55] "region_20km_ndvi"                                        "region_20km_ssm"                                         "region_20km_susm"                                       
[58] "region_50km_ndvi"                                        "region_50km_ssm"                                         "region_50km_susm"                                       
[61] "region_100km_ndvi"                                       "region_100km_ssm"                                        "region_100km_susm"                                      
[64] "city_percentage_protected"                               "region_20km_percentage_protected"                        "region_50km_percentage_protected"                       
[67] "region_100km_percentage_protected"                       "city_centre_latitude"                                    "abs_city_centre_latitude"                               
birdlife_response <- birdlife_city_data_fixed$response
birdlife_predictors <- birdlife_city_data_fixed[,-1]
birdlife_predictors
birdlife_interp <- VSURF(x = birdlife_predictors, y  = birdlife_response)
Thresholding step
Estimated computational time (on one core): 105.8 sec.

  |                                                                                                                                                                                         
  |                                                                                                                                                                                   |   0%
  |                                                                                                                                                                                         
  |====                                                                                                                                                                               |   2%
  |                                                                                                                                                                                         
  |=======                                                                                                                                                                            |   4%
  |                                                                                                                                                                                         
  |===========                                                                                                                                                                        |   6%
  |                                                                                                                                                                                         
  |==============                                                                                                                                                                     |   8%
  |                                                                                                                                                                                         
  |==================                                                                                                                                                                 |  10%
  |                                                                                                                                                                                         
  |=====================                                                                                                                                                              |  12%
  |                                                                                                                                                                                         
  |=========================                                                                                                                                                          |  14%
  |                                                                                                                                                                                         
  |=============================                                                                                                                                                      |  16%
  |                                                                                                                                                                                         
  |================================                                                                                                                                                   |  18%
  |                                                                                                                                                                                         
  |====================================                                                                                                                                               |  20%
  |                                                                                                                                                                                         
  |=======================================                                                                                                                                            |  22%
  |                                                                                                                                                                                         
  |===========================================                                                                                                                                        |  24%
  |                                                                                                                                                                                         
  |===============================================                                                                                                                                    |  26%
  |                                                                                                                                                                                         
  |==================================================                                                                                                                                 |  28%
  |                                                                                                                                                                                         
  |======================================================                                                                                                                             |  30%
  |                                                                                                                                                                                         
  |=========================================================                                                                                                                          |  32%
  |                                                                                                                                                                                         
  |=============================================================                                                                                                                      |  34%
  |                                                                                                                                                                                         
  |================================================================                                                                                                                   |  36%
  |                                                                                                                                                                                         
  |====================================================================                                                                                                               |  38%
  |                                                                                                                                                                                         
  |========================================================================                                                                                                           |  40%
  |                                                                                                                                                                                         
  |===========================================================================                                                                                                        |  42%
  |                                                                                                                                                                                         
  |===============================================================================                                                                                                    |  44%
  |                                                                                                                                                                                         
  |==================================================================================                                                                                                 |  46%
  |                                                                                                                                                                                         
  |======================================================================================                                                                                             |  48%
  |                                                                                                                                                                                         
  |==========================================================================================                                                                                         |  50%
  |                                                                                                                                                                                         
  |=============================================================================================                                                                                      |  52%
  |                                                                                                                                                                                         
  |=================================================================================================                                                                                  |  54%
  |                                                                                                                                                                                         
  |====================================================================================================                                                                               |  56%
  |                                                                                                                                                                                         
  |========================================================================================================                                                                           |  58%
  |                                                                                                                                                                                         
  |===========================================================================================================                                                                        |  60%
  |                                                                                                                                                                                         
  |===============================================================================================================                                                                    |  62%
  |                                                                                                                                                                                         
  |===================================================================================================================                                                                |  64%
  |                                                                                                                                                                                         
  |======================================================================================================================                                                             |  66%
  |                                                                                                                                                                                         
  |==========================================================================================================================                                                         |  68%
  |                                                                                                                                                                                         
  |=============================================================================================================================                                                      |  70%
  |                                                                                                                                                                                         
  |=================================================================================================================================                                                  |  72%
  |                                                                                                                                                                                         
  |====================================================================================================================================                                               |  74%
  |                                                                                                                                                                                         
  |========================================================================================================================================                                           |  76%
  |                                                                                                                                                                                         
  |============================================================================================================================================                                       |  78%
  |                                                                                                                                                                                         
  |===============================================================================================================================================                                    |  80%
  |                                                                                                                                                                                         
  |===================================================================================================================================================                                |  82%
  |                                                                                                                                                                                         
  |======================================================================================================================================================                             |  84%
  |                                                                                                                                                                                         
  |==========================================================================================================================================================                         |  86%
  |                                                                                                                                                                                         
  |==============================================================================================================================================================                     |  88%
  |                                                                                                                                                                                         
  |=================================================================================================================================================================                  |  90%
  |                                                                                                                                                                                         
  |=====================================================================================================================================================================              |  92%
  |                                                                                                                                                                                         
  |========================================================================================================================================================================           |  94%
  |                                                                                                                                                                                         
  |============================================================================================================================================================================       |  96%
  |                                                                                                                                                                                         
  |===============================================================================================================================================================================    |  98%
  |                                                                                                                                                                                         
  |===================================================================================================================================================================================| 100%
Interpretation step (on 48 variables)
Estimated computational time (on one core): between 67.2 sec. and  421.2 sec.

  |                                                                                                                                                                                         
  |                                                                                                                                                                                   |   0%
  |                                                                                                                                                                                         
  |====                                                                                                                                                                               |   2%
  |                                                                                                                                                                                         
  |=======                                                                                                                                                                            |   4%
  |                                                                                                                                                                                         
  |===========                                                                                                                                                                        |   6%
  |                                                                                                                                                                                         
  |===============                                                                                                                                                                    |   8%
  |                                                                                                                                                                                         
  |===================                                                                                                                                                                |  10%
  |                                                                                                                                                                                         
  |======================                                                                                                                                                             |  12%
  |                                                                                                                                                                                         
  |==========================                                                                                                                                                         |  15%
  |                                                                                                                                                                                         
  |==============================                                                                                                                                                     |  17%
  |                                                                                                                                                                                         
  |==================================                                                                                                                                                 |  19%
  |                                                                                                                                                                                         
  |=====================================                                                                                                                                              |  21%
  |                                                                                                                                                                                         
  |=========================================                                                                                                                                          |  23%
  |                                                                                                                                                                                         
  |=============================================                                                                                                                                      |  25%
  |                                                                                                                                                                                         
  |================================================                                                                                                                                   |  27%
  |                                                                                                                                                                                         
  |====================================================                                                                                                                               |  29%
  |                                                                                                                                                                                         
  |========================================================                                                                                                                           |  31%
  |                                                                                                                                                                                         
  |============================================================                                                                                                                       |  33%
  |                                                                                                                                                                                         
  |===============================================================                                                                                                                    |  35%
  |                                                                                                                                                                                         
  |===================================================================                                                                                                                |  38%
  |                                                                                                                                                                                         
  |=======================================================================                                                                                                            |  40%
  |                                                                                                                                                                                         
  |===========================================================================                                                                                                        |  42%
  |                                                                                                                                                                                         
  |==============================================================================                                                                                                     |  44%
  |                                                                                                                                                                                         
  |==================================================================================                                                                                                 |  46%
  |                                                                                                                                                                                         
  |======================================================================================                                                                                             |  48%
  |                                                                                                                                                                                         
  |==========================================================================================                                                                                         |  50%
  |                                                                                                                                                                                         
  |=============================================================================================                                                                                      |  52%
  |                                                                                                                                                                                         
  |=================================================================================================                                                                                  |  54%
  |                                                                                                                                                                                         
  |=====================================================================================================                                                                              |  56%
  |                                                                                                                                                                                         
  |========================================================================================================                                                                           |  58%
  |                                                                                                                                                                                         
  |============================================================================================================                                                                       |  60%
  |                                                                                                                                                                                         
  |================================================================================================================                                                                   |  62%
  |                                                                                                                                                                                         
  |====================================================================================================================                                                               |  65%
  |                                                                                                                                                                                         
  |=======================================================================================================================                                                            |  67%
  |                                                                                                                                                                                         
  |===========================================================================================================================                                                        |  69%
  |                                                                                                                                                                                         
  |===============================================================================================================================                                                    |  71%
  |                                                                                                                                                                                         
  |===================================================================================================================================                                                |  73%
  |                                                                                                                                                                                         
  |======================================================================================================================================                                             |  75%
  |                                                                                                                                                                                         
  |==========================================================================================================================================                                         |  77%
  |                                                                                                                                                                                         
  |==============================================================================================================================================                                     |  79%
  |                                                                                                                                                                                         
  |=================================================================================================================================================                                  |  81%
  |                                                                                                                                                                                         
  |=====================================================================================================================================================                              |  83%
  |                                                                                                                                                                                         
  |=========================================================================================================================================================                          |  85%
  |                                                                                                                                                                                         
  |=============================================================================================================================================================                      |  88%
  |                                                                                                                                                                                         
  |================================================================================================================================================================                   |  90%
  |                                                                                                                                                                                         
  |====================================================================================================================================================================               |  92%
  |                                                                                                                                                                                         
  |========================================================================================================================================================================           |  94%
  |                                                                                                                                                                                         
  |============================================================================================================================================================================       |  96%
  |                                                                                                                                                                                         
  |===============================================================================================================================================================================    |  98%
  |                                                                                                                                                                                         
  |===================================================================================================================================================================================| 100%
Prediction step (on 2 variables)
Maximum estimated computational time (on one core): 2.7 sec.

  |                                                                                                                                                                                         
  |                                                                                                                                                                                   |   0%
  |                                                                                                                                                                                         
  |==========================================================================================                                                                                         |  50%
  |                                                                                                                                                                                         
  |===================================================================================================================================================================================| 100%
names(birdlife_predictors[,birdlife_interp$varselect.interp])
[1] "population_growth" "region_50km_ssm"  
So….
Merlin: “abs_city_centre_latitude” “region_50km_elevation_delta” “biome_name” “region_50km_ssm” [5] “region_100km_ssm” “region_20km_elevation_delta” “region_20km_urban” “region_100km_elevation_delta” [9] “temperature_annual_average” “city_ndvi” “city_gdp_per_population” “shrubs” [13] “permanent_water” “city_centre_latitude” “region_20km_cultivated” Birdlife: “population_growth” “region_50km_ssm”

Try Modelling

merlin_city_data_named <- fetch_city_data_for('merlin', T)

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)
Joining, by = "name"
birdlife_city_data_named <- fetch_city_data_for('birdlife', T)

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)
Joining, by = "name"
Use cross validation and dropping terms to find best model

full model: response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_ndvi + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated

Merlin data set

merlin_city_data_fixed_no_boreal <- merlin_city_data_fixed[merlin_city_data_fixed$biome_name != 'Boreal Forests/Taiga',]
cv.glm(merlin_city_data_fixed_no_boreal, glm(data = merlin_city_data_fixed_no_boreal, formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_ndvi + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated))$delta[1]
[1] 19.9028

– CVE 19.72841 – Can we drop one?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_ndvi + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.98386
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_ndvi + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.55342
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_100km_elevation_delta + temperature_annual_average + city_ndvi + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.77626
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + temperature_annual_average + city_ndvi + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.85129
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + city_ndvi + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.64188
cv.glm(merlin_city_data_fixed_no_boreal, glm(data = merlin_city_data_fixed_no_boreal, formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated))$delta[1]
[1] 19.47279
cv.glm(merlin_city_data_fixed_no_boreal, glm(data = merlin_city_data_fixed_no_boreal, formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_ndvi + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated))$delta[1]
[1] 19.74441
cv.glm(merlin_city_data_fixed_no_boreal, glm(data = merlin_city_data_fixed_no_boreal, formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_ndvi + city_gdp_per_population + permanent_water + city_centre_latitude + region_20km_cultivated))$delta[1]
[1] 19.77247
cv.glm(merlin_city_data_fixed_no_boreal, glm(data = merlin_city_data_fixed_no_boreal, formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_ndvi + city_gdp_per_population + shrubs + city_centre_latitude + region_20km_cultivated))$delta[1]
[1] 19.70816
cv.glm(merlin_city_data_fixed_no_boreal, glm(data = merlin_city_data_fixed_no_boreal, formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_ndvi + city_gdp_per_population + shrubs + permanent_water + region_20km_cultivated))$delta[1]
[1] 19.59945
cv.glm(merlin_city_data_fixed_no_boreal, glm(data = merlin_city_data_fixed_no_boreal, formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_ndvi + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude))$delta[1]
[1] 19.62638

– drop city_ndvi to give smaller CVE of 19.35 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.58278
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.14889
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.36927
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.22395
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + shrubs + permanent_water + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.31519
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + permanent_water + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.35555
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + city_centre_latitude + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.29791
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.18198
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + city_centre_latitude, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.19893

– drop city_centre_latitude to give smaller CVE of 19.06 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.30999
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.87274
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.08238
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.14715
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + city_gdp_per_population + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.96295
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.02621
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.07168
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.01583
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_elevation_delta + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.93091

– drop region_20km_elevation_delta to give smaller CVE of 18.76 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.97096
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.76006
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.92942
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + city_gdp_per_population + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.65642
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + shrubs + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.72148
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + permanent_water + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.76699
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + region_20km_cultivated, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.70275
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.63424

– drop region_20km_cultivated to give smaller CVE of 18.54 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.77671
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.51919
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + temperature_annual_average + city_gdp_per_population + shrubs + permanent_water, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.70334
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + city_gdp_per_population + shrubs + permanent_water, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.427
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + shrubs + permanent_water, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.48533
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + permanent_water, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.54951
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.46802

– drop permanent_water to give smaller CVE of 18.34 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.53523
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.37394
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + temperature_annual_average + city_gdp_per_population + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.58989
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + city_gdp_per_population + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.27291
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.33385
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + temperature_annual_average + city_gdp_per_population, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.40014

– drop temperature_annual_average to give smaller CVE of 18.14 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_20km_urban + region_100km_elevation_delta + city_gdp_per_population + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.33645
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_100km_elevation_delta + city_gdp_per_population + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.13093
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + city_gdp_per_population + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.37243
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.14642
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_20km_urban + region_100km_elevation_delta + city_gdp_per_population, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.20601

– drop region_20km_urban to give smaller CVE of 18.03 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_elevation_delta + city_gdp_per_population + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.29319
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + city_gdp_per_population + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.22538
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_100km_elevation_delta + shrubs, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.01086
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_100km_elevation_delta + city_gdp_per_population, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.06183

– drop shrubs to give smaller CVE of 17.95 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_elevation_delta + city_gdp_per_population, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.18528
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + city_gdp_per_population, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.26039
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_100km_elevation_delta, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 17.94321

– drop city_gdp_per_population to give smaller CVE of 17.94 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_elevation_delta, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.06258
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.19515

– No

– best model with region_100km_ssm + region_100km_elevation_delta (CV error 17.91216)
summary(glm(data = merlin_city_data_fixed, formula = response ~ region_100km_ssm + region_100km_elevation_delta))

Call:
glm(formula = response ~ region_100km_ssm + region_100km_elevation_delta, 
    data = merlin_city_data_fixed)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-7.6625  -3.0246  -0.4496   1.9868  16.9640  

Coefficients:
                               Estimate Std. Error t value Pr(>|t|)  
(Intercept)                   2.6877517  1.1338124   2.371   0.0192 *
region_100km_ssm             -0.1327133  0.0698210  -1.901   0.0595 .
region_100km_elevation_delta -0.0005261  0.0002944  -1.787   0.0762 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 17.46142)

    Null deviance: 2469.6  on 136  degrees of freedom
Residual deviance: 2339.8  on 134  degrees of freedom
AIC: 785.57

Number of Fisher Scoring iterations: 2
reg_merlin = glm(data = merlin_city_data_fixed, formula = response ~ region_100km_ssm + region_100km_elevation_delta)
with(summary(reg_merlin), 1 - deviance/null.deviance)
[1] 0.05255

Birdlife data set

birdlife_city_data_fixed_no_boreal <- birdlife_city_data_fixed[birdlife_city_data_fixed$biome_name != 'Boreal Forests/Taiga',]
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + biome_name + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.899862

– can we drop a variable?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + biome_name + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.768164
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_elevation_delta + biome_name + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.752211
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + biome_name + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.989636
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.503421
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + biome_name, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.780578

– drop biome_name to give CVE of 6.503421 – can we drop another?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.417311
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_elevation_delta + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.426562
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.430742
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.439714

– drop region_100km_ssm to give CVE of 6.417311 – can we drop another?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_elevation_delta + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.535285
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.342025
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.352664

– drop region_50km_elevation_delta to give CVE of 6.342025 – can we drop another?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.464699
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.291299

– drop city_gdp_per_population to give CVE of 6.291299 – is this better than no variable?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ 1, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.395701

– yes, just!

– so best model with birdlife is region_50km_ssm
summary(glm(data = birdlife_city_data_fixed, formula = response ~ region_50km_ssm))

Call:
glm(formula = response ~ region_50km_ssm, data = birdlife_city_data_fixed)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-4.5353  -1.5461  -0.4124   1.3071  10.7572  

Coefficients:
                Estimate Std. Error t value Pr(>|t|)  
(Intercept)      1.26916    0.65041   1.951   0.0531 .
region_50km_ssm -0.08499    0.04115  -2.065   0.0408 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 6.214378)

    Null deviance: 865.45  on 136  degrees of freedom
Residual deviance: 838.94  on 135  degrees of freedom
AIC: 643.06

Number of Fisher Scoring iterations: 2
reg_birdlife = glm(data = birdlife_city_data_fixed, formula = response ~ region_50km_ssm)
with(summary(reg_birdlife), 1 - deviance/null.deviance)
[1] 0.03062471
ggplot(birdlife_city_data_named, aes(x = region_50km_ssm, y = response)) + geom_point() + geom_smooth(method = "glm")

Check birdlife model fit
birdlife.fit <- glm(data = birdlife_city_data_fixed, formula = response ~ region_50km_ssm)
summary(birdlife.fit)

Call:
glm(formula = response ~ region_50km_ssm, data = birdlife_city_data_fixed)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-4.5353  -1.5461  -0.4124   1.3071  10.7572  

Coefficients:
                Estimate Std. Error t value Pr(>|t|)  
(Intercept)      1.26916    0.65041   1.951   0.0531 .
region_50km_ssm -0.08499    0.04115  -2.065   0.0408 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 6.214378)

    Null deviance: 865.45  on 136  degrees of freedom
Residual deviance: 838.94  on 135  degrees of freedom
AIC: 643.06

Number of Fisher Scoring iterations: 2
with(summary(birdlife.fit), 1 - deviance/null.deviance)
[1] 0.03062471
plot(birdlife.fit)

birdlife_city_data_fixed_no_boreal[c(16, 53, 72), c("region_50km_ssm")]
[1] 18.451180  9.961682 11.644862
city_data[c(16, 53, 72), c("name", "region_50km_ssm")]
dat <- predict(glm(formula = response ~ region_50km_ssm, data = birdlife_city_data_named), se.fit=T)

outside_se <- birdlife_city_data_named[birdlife_city_data_named$response < dat$fit - 15* dat$se.fit | birdlife_city_data_named$response > dat$fit + 15 * dat$se.fit,]

birdlife_ssm = ggplot(birdlife_city_data_named, aes(x = region_50km_ssm, y = response)) + 
  geom_point(size=1, alpha = 0.2) + 
  geom_smooth(method = "glm") +
  geom_text_repel(aes(label = name), data = outside_se, size = 3, nudge_y = 1, color = "red") +
  geom_point(data = outside_se, color = "red") +
  theme_bw() +
  ylab("Standardized bird retention response") + xlab("Regional (50km) SSM")

birdlife_ssm
ggsave("city_effect_richness__output__birdlife.jpg")
Saving 7.29 x 4.51 in image

How much variation have we explained?

birdlife_city_data_named$residuals <- resid(birdlife.fit)
ggplot(birdlife_city_data_named, aes(y = response, x = residuals)) + 
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  labs(title = "Birdlife", subtitle = paste("Correlation", cor(birdlife_city_data_named$residuals, birdlife_city_data_named$response))) +
  theme_bw()

Check Merlin model fit
merlin.fit <- glm(data = merlin_city_data_named, formula = response ~ region_100km_ssm + region_50km_elevation_delta)
summary(merlin.fit)

Call:
glm(formula = response ~ region_100km_ssm + region_50km_elevation_delta, 
    data = merlin_city_data_named)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-7.6599  -2.9987  -0.5524   1.7449  16.9143  

Coefficients:
                              Estimate Std. Error t value Pr(>|t|)  
(Intercept)                  2.6809304  1.1210300   2.391   0.0182 *
region_100km_ssm            -0.1331207  0.0695604  -1.914   0.0578 .
region_50km_elevation_delta -0.0006899  0.0003461  -1.994   0.0482 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 17.36262)

    Null deviance: 2469.6  on 136  degrees of freedom
Residual deviance: 2326.6  on 134  degrees of freedom
AIC: 784.8

Number of Fisher Scoring iterations: 2
with(summary(merlin.fit), 1 - deviance/null.deviance)
[1] 0.05791102
plot(merlin.fit)

merlin_city_data_fixed_no_boreal[c(24, 42, 72), c("region_100km_ssm", "region_50km_elevation_delta")]
city_data[c(24, 42, 72), c("name", "region_100km_ssm", "region_50km_elevation_delta")]
ggplot(merlin_city_data_named, aes(x = region_100km_ssm, y = response)) + 
  geom_point(aes(size = region_50km_elevation_delta)) + 
  geom_smooth(method = "glm") +
  theme_bw() +
  theme(legend.position="bottom") +
  ylab("Standardized bird retention response") + xlab("SSM in 100 km surrounding city") + guides(size=guide_legend(title="Regional (50 km) elevation delta"))

ggsave("city_effect_richness__output__merlin.jpg")
Saving 7.29 x 4.51 in image

How much variation have we explained?

merlin_city_data_named$residuals <- resid(merlin.fit)
ggplot(merlin_city_data_named, aes(y = response, x = residuals)) + 
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  labs(title = "Merlin", subtitle = paste("Correlation", cor(merlin_city_data_named$residuals, merlin_city_data_named$response))) +
  theme_bw()

Check AIC
AIC(
  glm(data = merlin_city_data_fixed, formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + biome_name + population_growth),
  glm(data = merlin_city_data_fixed, formula = response ~ region_100km_ssm + region_50km_elevation_delta)
)
AIC(
  glm(data = birdlife_city_data_fixed, formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + biome_name + population_growth),
  glm(data = birdlife_city_data_fixed, formula = response ~ region_50km_ssm)
)
LDG
birdlife_data_with_lat = fetch_city_data_for('birdlife', include_city_name = T)

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)
Joining, by = "name"
model2 <- glm(formula = response ~ I(city_centre_latitude^2), data = birdlife_data_with_lat)
dat2 <- predict(model2, se.fit=T)
summary(model2)

Call:
glm(formula = response ~ I(city_centre_latitude^2), data = birdlife_data_with_lat)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-4.7461  -1.4878  -0.4638   1.2399   9.5839  

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)  
(Intercept)               -0.4426687  0.3308024  -1.338   0.1831  
I(city_centre_latitude^2)  0.0004780  0.0002725   1.754   0.0817 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 6.267835)

    Null deviance: 865.45  on 136  degrees of freedom
Residual deviance: 846.16  on 135  degrees of freedom
AIC: 644.23

Number of Fisher Scoring iterations: 2
with(summary(model2), 1 - deviance/null.deviance)
[1] 0.02228615
outside_ldg_se <- birdlife_data_with_lat[birdlife_data_with_lat$response < dat2$fit - 15* dat2$se.fit | birdlife_data_with_lat$response > dat2$fit + 15 * dat2$se.fit,]

birdlife_ldg = ggplot(birdlife_data_with_lat, aes(x = city_centre_latitude, y = response)) + 
  geom_point(size=1, alpha = 0.2) + 
  geom_smooth(method = "glm", formula = y ~ I(x^2)) +
  geom_text_repel(aes(label = name), data = outside_ldg_se, size = 3, nudge_y = 1, color = "red") +
  geom_point(data = outside_ldg_se, color = "red") +
  theme_bw() +
  ylab("Standardized bird retention response") + xlab("Latitude (of city centre)") + labs(title = "Birdlife LDG")

birdlife_ldg
ggsave('city_effect_richness__output__ldg_birdlife.jpg')
Saving 7.29 x 4.51 in image

library(grid)
library(gridExtra)
birdlife_plot_ldg = ggplot(birdlife_data_with_lat, aes(x = city_centre_latitude, y = response)) + 
  geom_point(size=1, alpha = 0.2) + 
  geom_smooth(method = "glm", formula = y ~ I(x^2)) +
  geom_text_repel(aes(label = name), data = outside_ldg_se, size = 3, nudge_y = 1, color = "red") +
  geom_point(data = outside_ldg_se, aes(color = region_50km_ssm)) +
  scale_colour_gradientn(colours = c("#ffee00", "#0019ff"), limits=c(5,22)) +
  guides(colour=guide_legend(title="SSM in 50 km surrounding city")) +
  theme_bw() +
  ylab("Standardized bird retention response") + xlab("Latitude (of city centre)") + 
  theme(legend.position="bottom", legend.box = "horizontal")

birdlife_plot_ldg

outside_ssm_se <- birdlife_city_data_named[birdlife_city_data_named$response < dat$fit - 15* dat$se.fit | birdlife_city_data_named$response > dat$fit + 15 * dat$se.fit,]

birdlife_ssm2 = ggplot(birdlife_city_data_named, aes(x = region_50km_ssm, y = response)) + 
  geom_point(size=1, alpha = 0.2) + 
  geom_smooth(method = "glm") +
  geom_text_repel(aes(label = name), data = outside_ssm_se, size = 3, nudge_y = 1, color = "red") +
  geom_point(data = outside_ssm_se, aes(color = region_50km_ssm)) +
  scale_colour_gradientn(colours = c("#ffee00", "#0019ff"), limits=c(5,22)) +
  guides(colour=guide_legend(title="SSM in 50 km surrounding city")) +
  theme_bw() +
  ylab("Standardized bird retention response") + xlab("SSM in 50 km surrounding city") +
  theme(legend.position="bottom", legend.box = "horizontal")

birdlife_ssm2

library(ggpubr)
birdlife_figure = ggarrange(birdlife_ssm2 + rremove("ylab"), birdlife_plot_ldg + rremove("ylab"), labels = c("a", "b"), ncol = 2, common.legend = T, legend = "bottom")
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
annotate_figure(birdlife_figure,
                left = text_grob("Standardized bird retention response", rot = 90))


ggsave('city_effect_richness__output__ldg_birdlife_with_ssm.jpg', height = 1500, width = 2250, units = "px")

merlin_data_with_lat = fetch_city_data_for('merlin', include_city_name = T)

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)
Joining, by = "name"
model2 <- glm(formula = response ~ I(city_centre_latitude^2), data = merlin_data_with_lat)
dat2 <- predict(model2, se.fit=T)
summary(model2)

Call:
glm(formula = response ~ I(city_centre_latitude^2), data = merlin_data_with_lat)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-9.209  -2.825  -0.388   1.463  18.438  

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)
(Intercept)                1.201e-02  5.651e-01   0.021    0.983
I(city_centre_latitude^2) -1.296e-05  4.655e-04  -0.028    0.978

(Dispersion parameter for gaussian family taken to be 18.29329)

    Null deviance: 2469.6  on 136  degrees of freedom
Residual deviance: 2469.6  on 135  degrees of freedom
AIC: 790.97

Number of Fisher Scoring iterations: 2
with(summary(model2), 1 - deviance/null.deviance)
[1] 5.74457e-06
outside_se <- merlin_data_with_lat[merlin_data_with_lat$response < dat2$fit - 15* dat2$se.fit | merlin_data_with_lat$response > dat2$fit + 15 * dat2$se.fit,]

ggplot(merlin_data_with_lat, aes(x = city_centre_latitude, y = response)) + 
  geom_point(size=1, alpha = 0.2) + 
  geom_smooth(method = "glm", formula = y ~ I(x^2)) +
  geom_text_repel(aes(label = name), data = outside_se, size = 3, nudge_y = 1, color = "red") +
  geom_point(data = outside_se, color = "red") +
  theme_bw() +
  ylab("Standardized bird retention response") + xlab("Latitude (of city centre)")

ggsave('city_effect_richness__output__ldg_merlin.jpg')
Saving 7.29 x 4.51 in image

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpSdW4gYGRvd25sb2FkX2RhdGEuUm1kYCBhbmQgYHBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3MuUm1kYCBGaXJzdCEKCmBgYHtyIHNldHVwfQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShycGFydCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmxpYnJhcnkobXVsdGNvbXApCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KFZTVVJGKQoKbGlicmFyeShib290KQoKbGlicmFyeShnZ3JlcGVsKQpgYGAKCmBgYHtyfQpjaXR5X2RhdGEKYGBgCgpgYGB7cn0KbGVuZ3RoKGNpdHlfZGF0YSRjaXR5X2dkcF9wZXJfcG9wdWxhdGlvblshaXMubmEoY2l0eV9kYXRhJGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uKV0pCmxlbmd0aChjaXR5X2RhdGEkcGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc1shaXMubmEoY2l0eV9kYXRhJHBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMpXSkKbGVuZ3RoKGNpdHlfZGF0YSRoYXBwaW5lc3NfZnV0dXJlX2xpZmVbIWlzLm5hKGNpdHlfZGF0YSRoYXBwaW5lc3NfZnV0dXJlX2xpZmUpXSkKbGVuZ3RoKGNpdHlfZGF0YSRtZWFuX3BvcHVsYXRpb25fZXhwb3N1cmVfdG9fcG0yXzVfMjAxOVshaXMubmEoY2l0eV9kYXRhJG1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5KV0pCmBgYAoKYGBge3J9CmZldGNoX2NpdHlfZGF0YV9mb3IgPC0gZnVuY3Rpb24ocG9vbF9uYW1lLCBpbmNsdWRlX2NpdHlfbmFtZSA9IEYpIHsKICByZXN1bHRzX2ZpbGVuYW1lIDwtIHBhc3RlKHBhc3RlKCdwZXJjZW50YWdlX29mX3JlZ2lvbmFsX3JpY2huZXNzX19vdXRwdXRfJywgcG9vbF9uYW1lLCAnY2l0eScsICdyaWNobmVzcycsICdpbnRlcmNlcHQnLCBzZXAgPSAiXyIpLCAiY3N2Iiwgc2VwID0gIi4iKQogIHJlc3VsdHMgPC0gcmVhZF9jc3YocmVzdWx0c19maWxlbmFtZSkKICAKICBqb2luZWQgPC0gbGVmdF9qb2luKGNpdHlfZGF0YSwgcmVzdWx0cykKICBqb2luZWQkYWJzX2NpdHlfY2VudHJlX2xhdGl0dWRlID0gYWJzKGpvaW5lZCRjaXR5X2NlbnRyZV9sYXRpdHVkZSkKICAKICByZXF1aXJlZF9jb2x1bW5zIDwtIGMoInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJhaW5mYWxsX2FubnVhbF9hdmVyYWdlIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWF4IiwgImhhcHBpbmVzc19uZWdhdGl2ZV9lZmZlY3QiLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJoYXBwaW5lc3NfZnV0dXJlX2xpZmUiLCAibnVtYmVyX29mX2Jpb21lcyIsICJyZWFsbSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8yMGttX2luY2x1ZGVzX2VzdHVhcnkiLCAicmVnaW9uXzUwa21faW5jbHVkZXNfZXN0dWFyeSIsICJyZWdpb25fMTAwa21faW5jbHVkZXNfZXN0dWFyeSIsICJjaXR5X2luY2x1ZGVzX2VzdHVhcnkiLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJyZWdpb25fNTBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInJlZ2lvbl8xMDBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfbWF4X3BvcF9kZW5zaXR5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJtZWFuX3BvcHVsYXRpb25fZXhwb3N1cmVfdG9fcG0yXzVfMjAxOSIsICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInJlZ2lvbl81MGttX2N1bHRpdmF0ZWQiLCAicmVnaW9uXzUwa21fdXJiYW4iLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJyZWdpb25fMjBrbV9tZWFuX2VsZXZhdGlvbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAicmVnaW9uXzUwa21fbWVhbl9lbGV2YXRpb24iLCAicmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSIsICJyZWdpb25fMTAwa21fbWVhbl9lbGV2YXRpb24iLCAiY2l0eV9lbGV2YXRpb25fZGVsdGEiLCAiY2l0eV9tZWFuX2VsZXZhdGlvbiIsICJ1cmJhbiIsICJzaHJ1YnMiLCAicGVybWFuZW50X3dhdGVyIiwgIm9wZW5fZm9yZXN0IiwgImhlcmJhY2VvdXNfd2V0bGFuZCIsICJoZXJiYWNlb3VzX3ZlZ2V0YXRpb24iLCAiY3VsdGl2YXRlZCIsICJjbG9zZWRfZm9yZXN0IiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfc3RyZWV0cyIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiY2l0eV9uZHZpIiwgImNpdHlfc3NtIiwgImNpdHlfc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3NzbSIsICJyZWdpb25fMjBrbV9zdXNtIiwgInJlZ2lvbl81MGttX25kdmkiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl81MGttX3N1c20iLCAicmVnaW9uXzEwMGttX25kdmkiLCAicmVnaW9uXzEwMGttX3NzbSIsICJyZWdpb25fMTAwa21fc3VzbSIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8yMGttX3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl81MGttX3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8xMDBrbV9wZXJjZW50YWdlX3Byb3RlY3RlZCIsICJjaXR5X2NlbnRyZV9sYXRpdHVkZSIsICJhYnNfY2l0eV9jZW50cmVfbGF0aXR1ZGUiKQogIAogIGlmIChpbmNsdWRlX2NpdHlfbmFtZSkgewogICAgcmVxdWlyZWRfY29sdW1ucyA8LSBhcHBlbmQoYygibmFtZSIpLCByZXF1aXJlZF9jb2x1bW5zKQogIH0KICAKICByZXF1aXJlZF9jb2x1bW5zIDwtIGFwcGVuZChjKCJyZXNwb25zZSIpLCByZXF1aXJlZF9jb2x1bW5zKQogIAogIGpvaW5lZFsscmVxdWlyZWRfY29sdW1uc10KfQpgYGAKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk1lcmxpbiBSZXNwb25zZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KbWVybGluX2NpdHlfZGF0YSA8LSBmZXRjaF9jaXR5X2RhdGFfZm9yKCdtZXJsaW4nKQptZXJsaW5fY2l0eV9kYXRhCmBgYAoKYGBge3J9Cm1lcmxpbl9jaXR5X2RhdGFfZml4ZWQgPC0gcmZJbXB1dGUocmVzcG9uc2UgfiAuLCBtZXJsaW5fY2l0eV9kYXRhKQptZXJsaW5fY2l0eV9kYXRhX2ZpeGVkCmBgYAoKYGBge3J9CmdncGxvdChtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkLCBhZXMocmVzcG9uc2UpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMikKYGBgCgpgYGB7cn0KbmFtZXMobWVybGluX2NpdHlfZGF0YV9maXhlZCkKYGBgCgpgYGB7cn0KbWVybGluX3Jlc3BvbnNlIDwtIG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQkcmVzcG9uc2UKbWVybGluX3ByZWRpY3RvcnMgPC0gbWVybGluX2NpdHlfZGF0YV9maXhlZFssLTFdCm1lcmxpbl9wcmVkaWN0b3JzCmBgYAoKYGBge3IsIGNhY2hlID0gVFJVRX0KbWVybGluX2ludGVycCA8LSBWU1VSRih4ID0gbWVybGluX3ByZWRpY3RvcnMsIHkgID0gbWVybGluX3Jlc3BvbnNlKQpgYGAKCmBgYHtyfQpuYW1lcyhtZXJsaW5fcHJlZGljdG9yc1ssbWVybGluX2ludGVycCR2YXJzZWxlY3QuaW50ZXJwXSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpcmRsaWZlIFJlc3BvbnNlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3J9CmJpcmRsaWZlX2NpdHlfZGF0YSA8LSBmZXRjaF9jaXR5X2RhdGFfZm9yKCdiaXJkbGlmZScpCmJpcmRsaWZlX2NpdHlfZGF0YQpgYGAKCgoKYGBge3J9CmdncGxvdChiaXJkbGlmZV9jaXR5X2RhdGEsIGFlcyhyZXNwb25zZSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKQpgYGAKCmBgYHtyfQpiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWQgPC0gcmZJbXB1dGUocmVzcG9uc2UgfiAuLCBiaXJkbGlmZV9jaXR5X2RhdGEpCmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZApgYGAKCmBgYHtyfQpuYW1lcyhiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWQpCmBgYAoKYGBge3J9CmJpcmRsaWZlX3Jlc3BvbnNlIDwtIGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCRyZXNwb25zZQpiaXJkbGlmZV9wcmVkaWN0b3JzIDwtIGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZFssLTFdCmJpcmRsaWZlX3ByZWRpY3RvcnMKYGBgCgoKYGBge3IsIGNhY2hlID0gVFJVRX0KYmlyZGxpZmVfaW50ZXJwIDwtIFZTVVJGKHggPSBiaXJkbGlmZV9wcmVkaWN0b3JzLCB5ICA9IGJpcmRsaWZlX3Jlc3BvbnNlKQpgYGAKCmBgYHtyfQpuYW1lcyhiaXJkbGlmZV9wcmVkaWN0b3JzWyxiaXJkbGlmZV9pbnRlcnAkdmFyc2VsZWN0LmludGVycF0pCmBgYAoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTby4uLi4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk1lcmxpbjogImFic19jaXR5X2NlbnRyZV9sYXRpdHVkZSIgICAgICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiICAiYmlvbWVfbmFtZSIgICAgICAgICAgICAgICAgICAgInJlZ2lvbl81MGttX3NzbSIgICAgICAgICAgICAgCiBbNV0gInJlZ2lvbl8xMDBrbV9zc20iICAgICAgICAgICAgICJyZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEiICAicmVnaW9uXzIwa21fdXJiYW4iICAgICAgICAgICAgInJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEiCiBbOV0gInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiAgICJjaXR5X25kdmkiICAgICAgICAgICAgICAgICAgICAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iICAgICAgInNocnVicyIgICAgICAgICAgICAgICAgICAgICAgClsxM10gInBlcm1hbmVudF93YXRlciIgICAgICAgICAgICAgICJjaXR5X2NlbnRyZV9sYXRpdHVkZSIgICAgICAgICAicmVnaW9uXzIwa21fY3VsdGl2YXRlZCIgICAgIApCaXJkbGlmZTogInBvcHVsYXRpb25fZ3Jvd3RoIiAicmVnaW9uXzUwa21fc3NtIiAgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUcnkgTW9kZWxsaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKYGBge3J9Cm1lcmxpbl9jaXR5X2RhdGFfbmFtZWQgPC0gZmV0Y2hfY2l0eV9kYXRhX2ZvcignbWVybGluJywgVCkKYmlyZGxpZmVfY2l0eV9kYXRhX25hbWVkIDwtIGZldGNoX2NpdHlfZGF0YV9mb3IoJ2JpcmRsaWZlJywgVCkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVXNlIGNyb3NzIHZhbGlkYXRpb24gYW5kIGRyb3BwaW5nIHRlcm1zIHRvIGZpbmQgYmVzdCBtb2RlbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bGwgbW9kZWw6ICByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEgKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIGNpdHlfbmR2aSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyICsgY2l0eV9jZW50cmVfbGF0aXR1ZGUgKyByZWdpb25fMjBrbV9jdWx0aXZhdGVkCgoKTWVybGluIGRhdGEgc2V0Ci0tLS0tLS0tLS0tLS0tLS0KYGBge3J9Cm1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsIDwtIG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbbWVybGluX2NpdHlfZGF0YV9maXhlZCRiaW9tZV9uYW1lICE9ICdCb3JlYWwgRm9yZXN0cy9UYWlnYScsXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEgKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIGNpdHlfbmR2aSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyICsgY2l0eV9jZW50cmVfbGF0aXR1ZGUgKyByZWdpb25fMjBrbV9jdWx0aXZhdGVkKSkkZGVsdGFbMV0KYGBgCgotLSBDVkUgMTkuNzI4NDEKLS0gQ2FuIHdlIGRyb3Agb25lPwoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9uZHZpICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIgKyBjaXR5X2NlbnRyZV9sYXRpdHVkZSArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIGNpdHlfbmR2aSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyICsgY2l0eV9jZW50cmVfbGF0aXR1ZGUgKyByZWdpb25fMjBrbV9jdWx0aXZhdGVkLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzIwa21fZWxldmF0aW9uX2RlbHRhICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9uZHZpICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIgKyBjaXR5X2NlbnRyZV9sYXRpdHVkZSArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEgKyByZWdpb25fMjBrbV91cmJhbiArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9uZHZpICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIgKyBjaXR5X2NlbnRyZV9sYXRpdHVkZSArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEgKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyBjaXR5X25kdmkgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHNocnVicyArIHBlcm1hbmVudF93YXRlciArIGNpdHlfY2VudHJlX2xhdGl0dWRlICsgcmVnaW9uXzIwa21fY3VsdGl2YXRlZCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzIwa21fZWxldmF0aW9uX2RlbHRhICsgcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHNocnVicyArIHBlcm1hbmVudF93YXRlciArIGNpdHlfY2VudHJlX2xhdGl0dWRlICsgcmVnaW9uXzIwa21fY3VsdGl2YXRlZCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9uZHZpICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyICsgY2l0eV9jZW50cmVfbGF0aXR1ZGUgKyByZWdpb25fMjBrbV9jdWx0aXZhdGVkKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzIwa21fZWxldmF0aW9uX2RlbHRhICsgcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBjaXR5X25kdmkgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHBlcm1hbmVudF93YXRlciArIGNpdHlfY2VudHJlX2xhdGl0dWRlICsgcmVnaW9uXzIwa21fY3VsdGl2YXRlZCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9uZHZpICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBjaXR5X2NlbnRyZV9sYXRpdHVkZSArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEgKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIGNpdHlfbmR2aSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyICsgcmVnaW9uXzIwa21fY3VsdGl2YXRlZCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9uZHZpICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIgKyBjaXR5X2NlbnRyZV9sYXRpdHVkZSkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBjaXR5X25kdmkgdG8gZ2l2ZSBzbWFsbGVyIENWRSBvZiAxOS4zNQotLSBjYW4gd2UgZHJvcCBhbm90aGVyPwoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIgKyBjaXR5X2NlbnRyZV9sYXRpdHVkZSArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIgKyBjaXR5X2NlbnRyZV9sYXRpdHVkZSArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEgKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHNocnVicyArIHBlcm1hbmVudF93YXRlciArIGNpdHlfY2VudHJlX2xhdGl0dWRlICsgcmVnaW9uXzIwa21fY3VsdGl2YXRlZCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyICsgY2l0eV9jZW50cmVfbGF0aXR1ZGUgKyByZWdpb25fMjBrbV9jdWx0aXZhdGVkLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzIwa21fZWxldmF0aW9uX2RlbHRhICsgcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIgKyBjaXR5X2NlbnRyZV9sYXRpdHVkZSArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBwZXJtYW5lbnRfd2F0ZXIgKyBjaXR5X2NlbnRyZV9sYXRpdHVkZSArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBjaXR5X2NlbnRyZV9sYXRpdHVkZSArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIgKyByZWdpb25fMjBrbV9jdWx0aXZhdGVkLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEgKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyICsgY2l0eV9jZW50cmVfbGF0aXR1ZGUsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAotLSBkcm9wIGNpdHlfY2VudHJlX2xhdGl0dWRlIHRvIGdpdmUgc21hbGxlciBDVkUgb2YgMTkuMDYKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEgKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyICsgcmVnaW9uXzIwa21fY3VsdGl2YXRlZCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIgKyByZWdpb25fMjBrbV9jdWx0aXZhdGVkLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEgKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHNocnVicyArIHBlcm1hbmVudF93YXRlciArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHNocnVicyArIHBlcm1hbmVudF93YXRlciArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV9lbGV2YXRpb25fZGVsdGEgKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHNocnVicyArIHBlcm1hbmVudF93YXRlciArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyICsgcmVnaW9uXzIwa21fY3VsdGl2YXRlZCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzIwa21fZWxldmF0aW9uX2RlbHRhICsgcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHBlcm1hbmVudF93YXRlciArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyByZWdpb25fMjBrbV9jdWx0aXZhdGVkLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzIwa21fZWxldmF0aW9uX2RlbHRhICsgcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHNocnVicyArIHBlcm1hbmVudF93YXRlciwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIHJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSB0byBnaXZlIHNtYWxsZXIgQ1ZFIG9mIDE4Ljc2Ci0tIGNhbiB3ZSBkcm9wIGFub3RoZXI/CgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHNocnVicyArIHBlcm1hbmVudF93YXRlciArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyICsgcmVnaW9uXzIwa21fY3VsdGl2YXRlZCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzIwa21fdXJiYW4gKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyICsgcmVnaW9uXzIwa21fY3VsdGl2YXRlZCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIgKyByZWdpb25fMjBrbV9jdWx0aXZhdGVkLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIHNocnVicyArIHBlcm1hbmVudF93YXRlciArIHJlZ2lvbl8yMGttX2N1bHRpdmF0ZWQsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBwZXJtYW5lbnRfd2F0ZXIgKyByZWdpb25fMjBrbV9jdWx0aXZhdGVkLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgc2hydWJzICsgcmVnaW9uXzIwa21fY3VsdGl2YXRlZCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCByZWdpb25fMjBrbV9jdWx0aXZhdGVkIHRvIGdpdmUgc21hbGxlciBDVkUgb2YgMTguNTQKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uICsgc2hydWJzICsgcGVybWFuZW50X3dhdGVyLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV91cmJhbiArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHNocnVicyArIHBlcm1hbmVudF93YXRlciwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBzaHJ1YnMgKyBwZXJtYW5lbnRfd2F0ZXIsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBwZXJtYW5lbnRfd2F0ZXIsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAotLSBkcm9wIHBlcm1hbmVudF93YXRlciB0byBnaXZlIHNtYWxsZXIgQ1ZFIG9mIDE4LjM0Ci0tIGNhbiB3ZSBkcm9wIGFub3RoZXI/CgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHNocnVicywgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX3VyYmFuICsgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiArIHNocnVicywgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlICsgc2hydWJzLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMjBrbV91cmJhbiArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyB0ZW1wZXJhdHVyZV9hbm51YWxfYXZlcmFnZSArIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCi0tIGRyb3AgdGVtcGVyYXR1cmVfYW5udWFsX2F2ZXJhZ2UgdG8gZ2l2ZSBzbWFsbGVyIENWRSBvZiAxOC4xNAotLSBjYW4gd2UgZHJvcCBhbm90aGVyPwpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX3VyYmFuICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYApgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8yMGttX3VyYmFuICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHNocnVicywgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzIwa21fdXJiYW4gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAotLSBkcm9wIHJlZ2lvbl8yMGttX3VyYmFuIHRvIGdpdmUgc21hbGxlciBDVkUgb2YgMTguMDMKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24gKyBzaHJ1YnMsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSArIHNocnVicywgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEgKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCi0tIGRyb3Agc2hydWJzIHRvIGdpdmUgc21hbGxlciBDVkUgb2YgMTcuOTUKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhICsgY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl8xMDBrbV9lbGV2YXRpb25fZGVsdGEsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCBjaXR5X2dkcF9wZXJfcG9wdWxhdGlvbiB0byBnaXZlIHNtYWxsZXIgQ1ZFIG9mIDE3Ljk0Ci0tIGNhbiB3ZSBkcm9wIGFub3RoZXI/CmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKLS0gTm8KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gYmVzdCBtb2RlbCB3aXRoIHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhIChDViBlcnJvciAxNy45MTIxNikKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CnN1bW1hcnkoZ2xtKGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSkpCmBgYAoKYGBge3J9CnJlZ19tZXJsaW4gPSBnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fMTAwa21fZWxldmF0aW9uX2RlbHRhKQp3aXRoKHN1bW1hcnkocmVnX21lcmxpbiksIDEgLSBkZXZpYW5jZS9udWxsLmRldmlhbmNlKQpgYGAKCkJpcmRsaWZlIGRhdGEgc2V0Ci0tLS0tLS0tLS0tLS0tLS0KYGBge3J9CmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwgPC0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkW2JpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCRiaW9tZV9uYW1lICE9ICdCb3JlYWwgRm9yZXN0cy9UYWlnYScsXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBiaW9tZV9uYW1lICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBjYW4gd2UgZHJvcCBhIHZhcmlhYmxlPwoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSArIGJpb21lX25hbWUgKyBwb3B1bGF0aW9uX2dyb3d0aCwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20gKyBiaW9tZV9uYW1lICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCi0tIGRyb3AgYmlvbWVfbmFtZSB0byBnaXZlIENWRSBvZiA2LjUwMzQyMQotLSBjYW4gd2UgZHJvcCBhbm90aGVyPwoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl81MGttX3NzbSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIHJlZ2lvbl8xMDBrbV9zc20gdG8gZ2l2ZSBDVkUgb2YgNi40MTczMTEKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSB0byBnaXZlIENWRSBvZiA2LjM0MjAyNQotLSBjYW4gd2UgZHJvcCBhbm90aGVyPwoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIHRvIGdpdmUgQ1ZFIG9mIDYuMjkxMjk5Ci0tIGlzIHRoaXMgYmV0dGVyIHRoYW4gbm8gdmFyaWFibGU/CgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiAxLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAotLSB5ZXMsIGp1c3QhCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIHNvIGJlc3QgbW9kZWwgd2l0aCBiaXJkbGlmZSBpcyByZWdpb25fNTBrbV9zc20KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CnN1bW1hcnkoZ2xtKGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSkpCmBgYAoKYGBge3J9CnJlZ19iaXJkbGlmZSA9IGdsbShkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20pCndpdGgoc3VtbWFyeShyZWdfYmlyZGxpZmUpLCAxIC0gZGV2aWFuY2UvbnVsbC5kZXZpYW5jZSkKYGBgCgoKYGBge3J9CmdncGxvdChiaXJkbGlmZV9jaXR5X2RhdGFfbmFtZWQsIGFlcyh4ID0gcmVnaW9uXzUwa21fc3NtLCB5ID0gcmVzcG9uc2UpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iKQpgYGAKCgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDaGVjayBiaXJkbGlmZSBtb2RlbCBmaXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KYmlyZGxpZmUuZml0IDwtIGdsbShkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20pCnN1bW1hcnkoYmlyZGxpZmUuZml0KQp3aXRoKHN1bW1hcnkoYmlyZGxpZmUuZml0KSwgMSAtIGRldmlhbmNlL251bGwuZGV2aWFuY2UpCnBsb3QoYmlyZGxpZmUuZml0KQpgYGAKCmBgYHtyfQpiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsW2MoMTYsIDUzLCA3MiksIGMoInJlZ2lvbl81MGttX3NzbSIpXQpgYGAKCmBgYHtyfQpjaXR5X2RhdGFbYygxNiwgNTMsIDcyKSwgYygibmFtZSIsICJyZWdpb25fNTBrbV9zc20iKV0KYGBgCgpgYGB7cn0KZGF0IDwtIHByZWRpY3QoZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9uYW1lZCksIHNlLmZpdD1UKQoKb3V0c2lkZV9zZSA8LSBiaXJkbGlmZV9jaXR5X2RhdGFfbmFtZWRbYmlyZGxpZmVfY2l0eV9kYXRhX25hbWVkJHJlc3BvbnNlIDwgZGF0JGZpdCAtIDE1KiBkYXQkc2UuZml0IHwgYmlyZGxpZmVfY2l0eV9kYXRhX25hbWVkJHJlc3BvbnNlID4gZGF0JGZpdCArIDE1ICogZGF0JHNlLmZpdCxdCgpiaXJkbGlmZV9zc20gPSBnZ3Bsb3QoYmlyZGxpZmVfY2l0eV9kYXRhX25hbWVkLCBhZXMoeCA9IHJlZ2lvbl81MGttX3NzbSwgeSA9IHJlc3BvbnNlKSkgKyAKICBnZW9tX3BvaW50KHNpemU9MSwgYWxwaGEgPSAwLjIpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIpICsKICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gbmFtZSksIGRhdGEgPSBvdXRzaWRlX3NlLCBzaXplID0gMywgbnVkZ2VfeSA9IDEsIGNvbG9yID0gInJlZCIpICsKICBnZW9tX3BvaW50KGRhdGEgPSBvdXRzaWRlX3NlLCBjb2xvciA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArCiAgeWxhYigiU3RhbmRhcmRpemVkIGJpcmQgcmV0ZW50aW9uIHJlc3BvbnNlIikgKyB4bGFiKCJSZWdpb25hbCAoNTBrbSkgU1NNIikKCmJpcmRsaWZlX3NzbQpnZ3NhdmUoImNpdHlfZWZmZWN0X3JpY2huZXNzX19vdXRwdXRfX2JpcmRsaWZlLmpwZyIpCmBgYAoKSG93IG11Y2ggdmFyaWF0aW9uIGhhdmUgd2UgZXhwbGFpbmVkPwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpiaXJkbGlmZV9jaXR5X2RhdGFfbmFtZWQkcmVzaWR1YWxzIDwtIHJlc2lkKGJpcmRsaWZlLmZpdCkKZ2dwbG90KGJpcmRsaWZlX2NpdHlfZGF0YV9uYW1lZCwgYWVzKHkgPSByZXNwb25zZSwgeCA9IHJlc2lkdWFscykpICsgCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEYpICsKICBsYWJzKHRpdGxlID0gIkJpcmRsaWZlIiwgc3VidGl0bGUgPSBwYXN0ZSgiQ29ycmVsYXRpb24iLCBjb3IoYmlyZGxpZmVfY2l0eV9kYXRhX25hbWVkJHJlc2lkdWFscywgYmlyZGxpZmVfY2l0eV9kYXRhX25hbWVkJHJlc3BvbnNlKSkpICsKICB0aGVtZV9idygpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkNoZWNrIE1lcmxpbiBtb2RlbCBmaXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KbWVybGluLmZpdCA8LSBnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfbmFtZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEpCnN1bW1hcnkobWVybGluLmZpdCkKd2l0aChzdW1tYXJ5KG1lcmxpbi5maXQpLCAxIC0gZGV2aWFuY2UvbnVsbC5kZXZpYW5jZSkKcGxvdChtZXJsaW4uZml0KQpgYGAKCmBgYHtyfQptZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbFtjKDI0LCA0MiwgNzIpLCBjKCJyZWdpb25fMTAwa21fc3NtIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIpXQpgYGAKCmBgYHtyfQpjaXR5X2RhdGFbYygyNCwgNDIsIDcyKSwgYygibmFtZSIsICJyZWdpb25fMTAwa21fc3NtIiwgInJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSIpXQpgYGAKCmBgYHtyfQpnZ3Bsb3QobWVybGluX2NpdHlfZGF0YV9uYW1lZCwgYWVzKHggPSByZWdpb25fMTAwa21fc3NtLCB5ID0gcmVzcG9uc2UpKSArIAogIGdlb21fcG9pbnQoYWVzKHNpemUgPSByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgeWxhYigiU3RhbmRhcmRpemVkIGJpcmQgcmV0ZW50aW9uIHJlc3BvbnNlIikgKyB4bGFiKCJTU00gaW4gMTAwIGttIHN1cnJvdW5kaW5nIGNpdHkiKSArIGd1aWRlcyhzaXplPWd1aWRlX2xlZ2VuZCh0aXRsZT0iUmVnaW9uYWwgKDUwIGttKSBlbGV2YXRpb24gZGVsdGEiKSkKCmdnc2F2ZSgiY2l0eV9lZmZlY3RfcmljaG5lc3NfX291dHB1dF9fbWVybGluLmpwZyIpCmBgYAoKSG93IG11Y2ggdmFyaWF0aW9uIGhhdmUgd2UgZXhwbGFpbmVkPwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3J9Cm1lcmxpbl9jaXR5X2RhdGFfbmFtZWQkcmVzaWR1YWxzIDwtIHJlc2lkKG1lcmxpbi5maXQpCmdncGxvdChtZXJsaW5fY2l0eV9kYXRhX25hbWVkLCBhZXMoeSA9IHJlc3BvbnNlLCB4ID0gcmVzaWR1YWxzKSkgKyAKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIGxhYnModGl0bGUgPSAiTWVybGluIiwgc3VidGl0bGUgPSBwYXN0ZSgiQ29ycmVsYXRpb24iLCBjb3IobWVybGluX2NpdHlfZGF0YV9uYW1lZCRyZXNpZHVhbHMsIG1lcmxpbl9jaXR5X2RhdGFfbmFtZWQkcmVzcG9uc2UpKSkgKwogIHRoZW1lX2J3KCkKYGBgCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDaGVjayBBSUMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CkFJQygKICBnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBiaW9tZV9uYW1lICsgcG9wdWxhdGlvbl9ncm93dGgpLAogIGdsbShkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSkKKQpgYGAKCmBgYHtyfQpBSUMoCiAgZ2xtKGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBiaW9tZV9uYW1lICsgcG9wdWxhdGlvbl9ncm93dGgpLAogIGdsbShkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20pCikKYGBgCgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQpMREcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpgYGB7cn0KYmlyZGxpZmVfZGF0YV93aXRoX2xhdCA9IGZldGNoX2NpdHlfZGF0YV9mb3IoJ2JpcmRsaWZlJywgaW5jbHVkZV9jaXR5X25hbWUgPSBUKQoKbW9kZWwyIDwtIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBJKGNpdHlfY2VudHJlX2xhdGl0dWRlXjIpLCBkYXRhID0gYmlyZGxpZmVfZGF0YV93aXRoX2xhdCkKZGF0MiA8LSBwcmVkaWN0KG1vZGVsMiwgc2UuZml0PVQpCnN1bW1hcnkobW9kZWwyKQoKd2l0aChzdW1tYXJ5KG1vZGVsMiksIDEgLSBkZXZpYW5jZS9udWxsLmRldmlhbmNlKQoKb3V0c2lkZV9sZGdfc2UgPC0gYmlyZGxpZmVfZGF0YV93aXRoX2xhdFtiaXJkbGlmZV9kYXRhX3dpdGhfbGF0JHJlc3BvbnNlIDwgZGF0MiRmaXQgLSAxNSogZGF0MiRzZS5maXQgfCBiaXJkbGlmZV9kYXRhX3dpdGhfbGF0JHJlc3BvbnNlID4gZGF0MiRmaXQgKyAxNSAqIGRhdDIkc2UuZml0LF0KCmJpcmRsaWZlX2xkZyA9IGdncGxvdChiaXJkbGlmZV9kYXRhX3dpdGhfbGF0LCBhZXMoeCA9IGNpdHlfY2VudHJlX2xhdGl0dWRlLCB5ID0gcmVzcG9uc2UpKSArIAogIGdlb21fcG9pbnQoc2l6ZT0xLCBhbHBoYSA9IDAuMikgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIiwgZm9ybXVsYSA9IHkgfiBJKHheMikpICsKICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gbmFtZSksIGRhdGEgPSBvdXRzaWRlX2xkZ19zZSwgc2l6ZSA9IDMsIG51ZGdlX3kgPSAxLCBjb2xvciA9ICJyZWQiKSArCiAgZ2VvbV9wb2ludChkYXRhID0gb3V0c2lkZV9sZGdfc2UsIGNvbG9yID0gInJlZCIpICsKICB0aGVtZV9idygpICsKICB5bGFiKCJTdGFuZGFyZGl6ZWQgYmlyZCByZXRlbnRpb24gcmVzcG9uc2UiKSArIHhsYWIoIkxhdGl0dWRlIChvZiBjaXR5IGNlbnRyZSkiKSArIGxhYnModGl0bGUgPSAiQmlyZGxpZmUgTERHIikKCmJpcmRsaWZlX2xkZwpnZ3NhdmUoJ2NpdHlfZWZmZWN0X3JpY2huZXNzX19vdXRwdXRfX2xkZ19iaXJkbGlmZS5qcGcnKQpgYGAKCgpgYGB7cn0KbGlicmFyeShncmlkKQpsaWJyYXJ5KGdyaWRFeHRyYSkKYmlyZGxpZmVfcGxvdF9sZGcgPSBnZ3Bsb3QoYmlyZGxpZmVfZGF0YV93aXRoX2xhdCwgYWVzKHggPSBjaXR5X2NlbnRyZV9sYXRpdHVkZSwgeSA9IHJlc3BvbnNlKSkgKyAKICBnZW9tX3BvaW50KHNpemU9MSwgYWxwaGEgPSAwLjIpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIGZvcm11bGEgPSB5IH4gSSh4XjIpKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IG5hbWUpLCBkYXRhID0gb3V0c2lkZV9sZGdfc2UsIHNpemUgPSAzLCBudWRnZV95ID0gMSwgY29sb3IgPSAicmVkIikgKwogIGdlb21fcG9pbnQoZGF0YSA9IG91dHNpZGVfbGRnX3NlLCBhZXMoY29sb3IgPSByZWdpb25fNTBrbV9zc20pKSArCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50bihjb2xvdXJzID0gYygiI2ZmZWUwMCIsICIjMDAxOWZmIiksIGxpbWl0cz1jKDUsMjIpKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9IlNTTSBpbiA1MCBrbSBzdXJyb3VuZGluZyBjaXR5IikpICsKICB0aGVtZV9idygpICsKICB5bGFiKCJTdGFuZGFyZGl6ZWQgYmlyZCByZXRlbnRpb24gcmVzcG9uc2UiKSArIHhsYWIoIkxhdGl0dWRlIChvZiBjaXR5IGNlbnRyZSkiKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwgbGVnZW5kLmJveCA9ICJob3Jpem9udGFsIikKCmJpcmRsaWZlX3Bsb3RfbGRnCmBgYApgYGB7cn0Kb3V0c2lkZV9zc21fc2UgPC0gYmlyZGxpZmVfY2l0eV9kYXRhX25hbWVkW2JpcmRsaWZlX2NpdHlfZGF0YV9uYW1lZCRyZXNwb25zZSA8IGRhdCRmaXQgLSAxNSogZGF0JHNlLmZpdCB8IGJpcmRsaWZlX2NpdHlfZGF0YV9uYW1lZCRyZXNwb25zZSA+IGRhdCRmaXQgKyAxNSAqIGRhdCRzZS5maXQsXQoKYmlyZGxpZmVfc3NtMiA9IGdncGxvdChiaXJkbGlmZV9jaXR5X2RhdGFfbmFtZWQsIGFlcyh4ID0gcmVnaW9uXzUwa21fc3NtLCB5ID0gcmVzcG9uc2UpKSArIAogIGdlb21fcG9pbnQoc2l6ZT0xLCBhbHBoYSA9IDAuMikgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIikgKwogIGdlb21fdGV4dF9yZXBlbChhZXMobGFiZWwgPSBuYW1lKSwgZGF0YSA9IG91dHNpZGVfc3NtX3NlLCBzaXplID0gMywgbnVkZ2VfeSA9IDEsIGNvbG9yID0gInJlZCIpICsKICBnZW9tX3BvaW50KGRhdGEgPSBvdXRzaWRlX3NzbV9zZSwgYWVzKGNvbG9yID0gcmVnaW9uXzUwa21fc3NtKSkgKwogIHNjYWxlX2NvbG91cl9ncmFkaWVudG4oY29sb3VycyA9IGMoIiNmZmVlMDAiLCAiIzAwMTlmZiIpLCBsaW1pdHM9Yyg1LDIyKSkgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPSJTU00gaW4gNTAga20gc3Vycm91bmRpbmcgY2l0eSIpKSArCiAgdGhlbWVfYncoKSArCiAgeWxhYigiU3RhbmRhcmRpemVkIGJpcmQgcmV0ZW50aW9uIHJlc3BvbnNlIikgKyB4bGFiKCJTU00gaW4gNTAga20gc3Vycm91bmRpbmcgY2l0eSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsIGxlZ2VuZC5ib3ggPSAiaG9yaXpvbnRhbCIpCgpiaXJkbGlmZV9zc20yCmBgYAoKYGBge3J9CmxpYnJhcnkoZ2dwdWJyKQpiaXJkbGlmZV9maWd1cmUgPSBnZ2FycmFuZ2UoYmlyZGxpZmVfc3NtMiArIHJyZW1vdmUoInlsYWIiKSwgYmlyZGxpZmVfcGxvdF9sZGcgKyBycmVtb3ZlKCJ5bGFiIiksIGxhYmVscyA9IGMoImEiLCAiYiIpLCBuY29sID0gMiwgY29tbW9uLmxlZ2VuZCA9IFQsIGxlZ2VuZCA9ICJib3R0b20iKQphbm5vdGF0ZV9maWd1cmUoYmlyZGxpZmVfZmlndXJlLAogICAgICAgICAgICAgICAgbGVmdCA9IHRleHRfZ3JvYigiU3RhbmRhcmRpemVkIGJpcmQgcmV0ZW50aW9uIHJlc3BvbnNlIiwgcm90ID0gOTApKQoKZ2dzYXZlKCdjaXR5X2VmZmVjdF9yaWNobmVzc19fb3V0cHV0X19sZGdfYmlyZGxpZmVfd2l0aF9zc20uanBnJywgaGVpZ2h0ID0gMTUwMCwgd2lkdGggPSAyMjUwLCB1bml0cyA9ICJweCIpCmBgYAoKYGBge3J9Cm1lcmxpbl9kYXRhX3dpdGhfbGF0ID0gZmV0Y2hfY2l0eV9kYXRhX2ZvcignbWVybGluJywgaW5jbHVkZV9jaXR5X25hbWUgPSBUKQoKbW9kZWwyIDwtIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiBJKGNpdHlfY2VudHJlX2xhdGl0dWRlXjIpLCBkYXRhID0gbWVybGluX2RhdGFfd2l0aF9sYXQpCmRhdDIgPC0gcHJlZGljdChtb2RlbDIsIHNlLmZpdD1UKQpzdW1tYXJ5KG1vZGVsMikKCndpdGgoc3VtbWFyeShtb2RlbDIpLCAxIC0gZGV2aWFuY2UvbnVsbC5kZXZpYW5jZSkKCm91dHNpZGVfc2UgPC0gbWVybGluX2RhdGFfd2l0aF9sYXRbbWVybGluX2RhdGFfd2l0aF9sYXQkcmVzcG9uc2UgPCBkYXQyJGZpdCAtIDE1KiBkYXQyJHNlLmZpdCB8IG1lcmxpbl9kYXRhX3dpdGhfbGF0JHJlc3BvbnNlID4gZGF0MiRmaXQgKyAxNSAqIGRhdDIkc2UuZml0LF0KCmdncGxvdChtZXJsaW5fZGF0YV93aXRoX2xhdCwgYWVzKHggPSBjaXR5X2NlbnRyZV9sYXRpdHVkZSwgeSA9IHJlc3BvbnNlKSkgKyAKICBnZW9tX3BvaW50KHNpemU9MSwgYWxwaGEgPSAwLjIpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIGZvcm11bGEgPSB5IH4gSSh4XjIpKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IG5hbWUpLCBkYXRhID0gb3V0c2lkZV9zZSwgc2l6ZSA9IDMsIG51ZGdlX3kgPSAxLCBjb2xvciA9ICJyZWQiKSArCiAgZ2VvbV9wb2ludChkYXRhID0gb3V0c2lkZV9zZSwgY29sb3IgPSAicmVkIikgKwogIHRoZW1lX2J3KCkgKwogIHlsYWIoIlN0YW5kYXJkaXplZCBiaXJkIHJldGVudGlvbiByZXNwb25zZSIpICsgeGxhYigiTGF0aXR1ZGUgKG9mIGNpdHkgY2VudHJlKSIpCgpnZ3NhdmUoJ2NpdHlfZWZmZWN0X3JpY2huZXNzX19vdXRwdXRfX2xkZ19tZXJsaW4uanBnJykKYGBg